package com.wxh.restful.controller;

import com.wxh.restful.annotations.ResponseResult;
import com.wxh.restful.common.ResultInfo;
import com.wxh.restful.enums.ResultCode;
import com.wxh.restful.model.Order;
import com.wxh.restful.service.OrderService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;

/**
 * @ClassName: OrderController
 * @Description: 订单控制器
 * @Author wxh
 * @Date: 2020/7/17 14:45
 * @Version V1.0.0
 * @Since 1.8
 */
@RestController
@RequestMapping(value = "/orders")
@ResponseResult
public class OrderController {
    @Resource
    private OrderService orderService;

    /**
     * 优化 ResultInfo构造方法进行包装赋值代码
     * @param id 订单ID
     * @return ResultInfo
     */
//    @GetMapping(value = "/{id}")
    public ResultInfo getOrder(@PathVariable(value = "id") Integer id){
//        Order order = orderService.getOrderById(id);
//        ResultInfo resultInfo = new ResultInfo(ResultCode.SUCCESS,order);
//        return resultInfo;

        // 可以优化代码ResultInfo每次new创建对象
        if(id == null){
            return ResultInfo.failure(ResultCode.PARAM_IS_INVALID);
        }
        Order order = orderService.getOrderById(id);
        return ResultInfo.success(order);
    }

    /**
     * 优化逻辑判断条件代码，返回有业务含义的对象
     * 1、每个方法的返回都是Result封装对象，没有业务含义
     * 2、在业务代码中，成功的时候我们调用Result.success，异常错误调用Result.failure。是不是很多余
     * 3、上面的代码，判断id是否为null，其实我们可以使用hibernate validate做校验，没有必要在方法体中做判断。
     * @param id 订单ID
     * @return ResultInfo
     */
    @GetMapping(value = "/{id}")
    public Order getOrder2(@PathVariable(value = "id") Integer id){
//        if(id == null){
//            return ResultInfo.failure(ResultCode.PARAM_IS_INVALID);
//        }
//        Order order = orderService.getOrderById(id);
//        return ResultInfo.success(order);


        /**
         * 1、定义一个注解@ResponseResult，表示这个接口返回的值需要包装一下
         * 2、拦截请求，判断此请求是否需要被@ResponseResult注解
         * 3、核心步骤就是实现接口ResponseBodyAdvice和@ControllerAdvice，
         * 判断是否需要包装返回值，如果需要，就把Controller接口的返回值进行重写。
         */
        // 可以优化代码id == null判断条件
        Order order = orderService.getOrderById(id);
        return order;
    }
}
